#include <iostream>
#include <string>
#include "../comm/httplib.h"
#include "oj_control.hpp"
using namespace httplib;
using namespace controlNs;

static Control* pctr;

void Recovery(int signo) {
    pctr->RecoveryMachine();
}


// 提供路由功能
int main(int argc, char* args[]) {
    signal(SIGQUIT, Recovery);
    Control ctr;
    pctr = &ctr;
    if (argc != 2) {
        std::cout << "Usage:\n\t" << args[0] << " local_port\n" << std::endl;
        return 0;
    }
    uint16_t port = std::stoi(args[1]);

    // 先创建个服务器
    Server svr;

    // 请求所有题目列表的页面
    svr.Get("/all_questions", [&ctr](const Request& req, Response& resp) {
        // 获取网页
        std::string html;
        ctr.GetAllQuestionsHtml(&html);
        resp.set_content(html, "text/html;charset=utf-8");
    });

    // 请求某一道题目的页面
    svr.Get(R"(/question/(\d+))", [&ctr](const Request& req, Response& resp) {
        // 先获取题目编号
        std::string number = req.matches[1];
        std::string html;
        ctr.GetOneQuestionHtml(std::stoi(number), &html);
        resp.set_content(html, "text/html;charset=utf-8");
    }
    );

    // 请求判提供能
    svr.Post(R"(/judge/(\d+))", [&ctr](const Request& req, Response& resp){
        // 获得题目编号
        std::string number = req.matches[1];
        std::string result_json;
        // req的body就是请求的json串， 包含用户提交的有header的代码加上用户自己写的代码组成的一个完成代码，和用户的input
        ctr.Judge(number, req.body, &result_json);
        resp.set_content(result_json, "application/json;charset=utf-8");
    });

    svr.set_base_dir("./wwwroot"); // 设置根目录

    // 启动服务器
    svr.listen("0.0.0.0", port);
    return 0;
}